package com.nettyBasic.n7_byteBuf;

import com.nettyBasic.util.ByteBufLog;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufAllocator;

/**
 * @author： pang-yun
 * @date： 2021-09-14 10:37
 * 功能目的 ：用于  测试Slice 切片方法
 *
 *      切片之后  在 切片1 改动一个 字节  发现  原始的 buf 也有字节字节  说明 切片用的还是 最初的buf
 *
 *      注意点 : bytebuf 切片后 有 大小限制
 *
 */

public class BufSlice {
    public static void main(String[] args) {
        ByteBuf buf = ByteBufAllocator.DEFAULT.buffer(10);
        buf.writeBytes(new byte[]{'a','b','c','d','e','f','g','h','i','k'});
        ByteBufLog.bufLog(buf);

        //使用slice 进行切片
        ByteBuf buf1 = buf.slice(0, 5);
        ByteBuf buf2 = buf.slice(5, 5);
        ByteBufLog.bufLog(buf1);
        ByteBufLog.bufLog(buf2);

        System.out.println("----------------");

        buf1.setByte(0,'z');

        ByteBufLog.bufLog(buf);
        ByteBufLog.bufLog(buf1);

        //-------------------------加入新的字节----此时会报错---大小会限制
        //buf1.writeByte('o');
        //ByteBufLog.log(buf1);

        System.out.println("------------release+retain---------------");
        // 释放 buf1 的内存 此时 原始的ByteBuf 也不能使用  因为使用的是 同一个内存
        // 如果真想释放 buf1 的内存  需提前使用 retain 先+1
        buf1.retain();

        buf.release();

        ByteBufLog.bufLog(buf);
        ByteBufLog.bufLog(buf1);


    }
}
